﻿using FactoryClsssLib.Examples;
using FactoryClsssLib.Examples2;
using FactoryClsssLib.Factory;
using FactoryClsssLib.Strategy;
using System.Reflection;

namespace FactoryMode
{
    internal class Program
    {
        static void Main(string[] args)
        {
            #region 工厂模式
            {
                // 1、直接接口使用
                IShape shape = new Circle();//

                shape = new Rectangle(); // 矩形区域
                shape = new Square(); //正方形区域
                shape.Draw();

                //1、开闭原则，对扩展开放，修改关闭。
                //2、工厂模式使用
                //2.1、创建形状工厂对象

                 //使用插件思想。
                 //1、类库
                 //2、反射
                 //abp vnext 插件
                //ShapeFactory shapeFactory = new ShapeFactory();

                //IShape shape1 = shapeFactory.getShape(args[0]);

                //shape1.Draw();

                /// 使用配置的方式
                // 1、json / 数据库
                // 2、反射
                // 3、字典
                ShapeFactory shapeFactory = new ShapeFactory();

                IShape shape1 = shapeFactory.Getreflect<Circle>();

                shape1.Draw();
            }
            #endregion

            #region 抽象工厂模式
            {
                IAbstractFactory<IColor> abstractFactory = new ColorFactory();

                IAbstractFactory<IShape> abstractFactory1
                    = new ShapeFactory();

                IAbstractFactory<IColor> abstractFactory2
                    = new TonyCodeFactory();

                //IAbstractFactory<IColor> factory =
                //         (IAbstractFactory<IColor>)FactoryProducer.getFactory("COLOR");
                // 不能使用工厂接口选择器，泛型原因导致的。
                // 抽象工厂：项目中出现了多个工厂需要的规范的时候使用。
            }
            #endregion

            #region 策略模式
            //情况不同 ，完成同一件事，方法不同
            // 1、计算方法
            Arithmetic arithmetic = new Arithmetic();

            // 2、根据情况选择策略
            arithmetic.strategy = StrategyFactory.GetStrategy("小偷");
            //arithmetic.strategy = new OperationY();

            arithmetic.arithmetic(5, 10);

            // 总结
            // 1、情况：环境
            // 2、行为：方法
            // 上传文件。阿里云。客户1，客户2 ，华为云，客户3，腾讯云
            // 监控并发量  CPU 消耗50% 发送邮件。CPU 消耗80% 给老板打电话。


            // 2、通用类实现
            IStrategy strategy = new OperationDivision();
            Arithmetic arithmeticx = new Arithmetic();
            arithmeticx.strategy = strategy;
            int sum = arithmetic.arithmetic(10, 5);


            // 3、策略类实现
            Context context = new Context(new OperationAdd());
            Console.WriteLine("10 + 5 = " + context.executeStrategy(10, 5));

            context = new Context(new OperationSubtract());
            Console.WriteLine("10 - 5 = " + context.executeStrategy(10, 5));

            context = new Context(new OperationMultiply());
            Console.WriteLine("10 * 5 = " + context.executeStrategy(10, 5));
            #endregion
        }
    }
}
